package com.by.controller;


import com.by.common.bean.ResultBean;
import com.by.utils.DateUtils;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.*;

@RestController
@RequestMapping("/upload")
public class UploadController extends BaseController {

    /**
     * 默认附件存放的目录
     */
    private static final String DIR = "/attachment/";

    static Set<String> allowType = null;

    static {
        allowType = new HashSet<>();
        allowType.add("image/png");
        allowType.add("image/jpeg");
    }

    @PostMapping("/img")
    public ResultBean uploadImage(MultipartFile myFile, HttpServletRequest request) {
        //判断上传文件的类型是否允许
        String type = myFile.getContentType();
        if (!allowType.contains(type)) {
            return fail("只允许上传的类型：" + Arrays.toString(allowType.toArray()));
        }
        //上传图片
        String path = upload(myFile, request, null);
        return success("上传成功", path);
    }


    /**
     * 批量文件上传
     *
     * @param myFiles 要批量上传的文件
     * @param request
     * @return
     */
    @PostMapping("/batchImg")
    public List batchUploadImage(List<MultipartFile> myFiles, HttpServletRequest request) {

        List<ResultBean> result = new ArrayList<>();//存放批量上传后的图片路径
        //遍历上传的文件
        Iterator<MultipartFile> it = myFiles.iterator();
        while (it.hasNext()) {
            MultipartFile tmpFile = it.next();
            //判断上传文件的类型是否允许
            String type = tmpFile.getContentType();
            if (!allowType.contains(type)) {
                result.add(fail(tmpFile.getOriginalFilename(), "上传的文件格式不正确！"));
            } else {
                //上传操作
                String path = upload(tmpFile, request, null);
                result.add(success(tmpFile.getOriginalFilename(), path));
            }
        }
        return result;
    }

    /**
     * 批量文件上传
     *
     * @param myFiles 要批量上传的文件
     * @param request
     * @return
     */
    @PostMapping("/file")
    public ResultBean upload(MultipartFile file, HttpServletRequest request) {
        Map rsMap = new HashMap();
        //文件名称
        rsMap.put("name", file.getOriginalFilename());
        rsMap.put("size", file.getSize());
        rsMap.put("uploadDate", DateUtils.getSysTime());
        //上传操作
        String path = upload(file, request, "erp");
        rsMap.put("url", path);
        return success("上传成功", rsMap);
    }

    /**
     * 上传文件
     *
     * @param file
     * @param request
     * @param type    上传文件的类型   如果为null 默认为images
     * @return 上传成功后的文件路径
     */
    String upload(MultipartFile file, HttpServletRequest request, String type) {
        //获取附件存放目录
        DestFile destFile = getTargetDir(request, type);
        //新的文件名
        String newFileName = getNewFileName(file.getOriginalFilename());

        try {
            //文件上传
            file.transferTo(new File(destFile.toString(), newFileName));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return destFile.relativePath + newFileName;
    }


    /**
     * 获取文件 上传的目录 如果不存在 创建
     *
     * @param request
     * @param type    上传文件的类型  如果为null  默认为images
     * @return 返回目标目录
     */
    DestFile getTargetDir(HttpServletRequest request, String type) {
        if (null == type || "".equals(type)) {
            type = "images";
        }

        //获取服务器根路径
        String rootPath = request.getServletContext().getRealPath("/");
        DestFile destFile = new DestFile(rootPath, DIR + type + "/" + getYm() + "/");
        //创建服务器存放附件的目录
        File dir = new File(destFile.getRoot() + destFile.getRelativePath());
        //判断目录是否存在
        if (!dir.exists()) {
            dir.mkdirs();
        }
        return destFile;
    }

    /**
     * 获取指定文件的后缀
     *
     * @param filename 文件名
     * @return 后缀如  .jpg
     */
    String getFileSufix(String filename) {
        return filename.substring(filename.lastIndexOf("."));
    }

    /**
     * 获取新文件名
     *
     * @param oldFileName 旧的文件名
     * @return
     */
    String getNewFileName(String oldFileName) {
        //获取附件的后缀
        String sufix = getFileSufix(oldFileName);
        //新的文件名
        String newFileName = System.currentTimeMillis() + sufix;
        return newFileName;
    }

    /**
     * 获取年月
     *
     * @return
     */
    String getYm() {
        LocalDate date = LocalDate.now();
        return date.format(DateTimeFormatter.ofPattern("yyyyMM"));
    }

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    class DestFile {
        String root;//服务器根路径
        String relativePath;//服务器相对路径

        @Override
        public String toString() {
            return root + relativePath;
        }
    }
}
